package org.wedding.config.redis;

import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.StrUtil;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.transaction.annotation.Transactional;
import org.wedding.center.entity.AmountInfo;
import org.wedding.center.entity.CouponInfo;
import org.wedding.center.entity.NoticeInfo;
import org.wedding.center.entity.OrderInfo;
import org.wedding.center.service.AmountInfoService;
import org.wedding.center.service.CouponInfoService;
import org.wedding.center.service.NoticeInfoService;
import org.wedding.center.service.OrderInfoService;

import javax.annotation.Resource;

/**
 * redis监听器 按KEY监听
 */
public class OrderKeyExpirationListener extends KeyExpirationEventMessageListener {
    @Resource
    private OrderInfoService orderInfoService;
    @Resource
    private AmountInfoService amountInfoService;
    @Resource
    private NoticeInfoService noticeInfoService;

    // 构造函数，传入RedisMessageListenerContainer参数
    public OrderKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }

    // 重写onMessage方法，处理消息
    @Override
    @Transactional
    public void onMessage(Message message, byte[] pattern) {
        // 将消息转换为字符串
        String key = message.toString();
        // 输出优惠卷信息
        System.out.println("订单支付时间超过1小时！订单支付时间超过1小时！订单支付时间超过1小时！订单支付时间超过1小时！订单支付时间超过1小时！订单支付时间超过1小时！订单支付时间超过1小时！订单支付时间超过1小时！订单支付时间超过1小时！订单支付时间超过1小时！订单支付时间超过1小时！订单支付时间超过1小时！订单支付时间超过1小时！订单支付时间超过1小时！订单支付时间超过1小时！订单支付时间超过1小时！");
        // 判断key是否以"order:"开头
        if (key.startsWith("order:")) {
            // 处理order相关的超时逻辑
            String id = key.replace("order:", "");
            System.out.println("订单id: " + id);
            //更新商家余额
            OrderInfo order = orderInfoService.view(id).getData();
            if (order != null && StrUtil.isNotEmpty(order.getIsDeposit()) && "0".equals(order.getIsDeposit())) {
                //订单金额到商户余额
                amountInfoService.add(AmountInfo.builder()
                        .userId(order.getMerchantId())
                        .userName(order.getMerchantName())
                        .changeAmount(order.getAmount())
                        .changeType("0")
                        .changeDetails("取消订单，定金到商家余额")
                        .cashStatus("1")
                        .build());
            }
        }
    }
}
